package com.idis.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.idis.common.dictionary.UserRole;
import com.idis.common.util.SecurityUtil;
import com.idis.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Ming on 2018/1/29.
 */

/**
 * 登录用户服务
 */
@Service
public class UserService{

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    String DBUrl;

    private final String USER="/user";

    private final String FIND_ALL="/all";

    private final String SAVE="/save";

    private final String UPDATE_NOT_NULL="/updatenotnull";

    private final String UPDATE="/update";

    private final String FIND_BY_PROP="/findbyproperty";

    private final String DELETE="/delete";

    /**
     * 获取所有用户信息
     * @return 用户信息集
     */
    public List<User> findAll(){
        List<User> users;
        users = restTemplate.exchange(DBUrl+USER+FIND_ALL, HttpMethod.GET, null, new ParameterizedTypeReference<ArrayList<User>>(){}).getBody();
        return users;
    }

    /**
     * 插入新用户记录
     * @param user 用户信息
     * @return 成功插入的数量
     */
    public Integer savaUser(User user){
        return restTemplate.postForObject(DBUrl+USER+SAVE,user,Integer.class);
    }

    /**
     * 更新用户信息，仅更新非空属性，ID必须
     * @param user 用户信息
     * @return 成功更新的数量
     */
    public Integer update(User user){
        return restTemplate.postForObject(DBUrl+USER+UPDATE,user,Integer.class);
    }

    /**
     * 删除用户信息
     * @param user 用户信息，必须包含ID
     * @return 成功删除的数量
     */
    public Integer delete(User user){
        return restTemplate.postForObject(DBUrl+USER+DELETE,user,Integer.class);
    }

    /**
     * 更新用户信息，仅更新非空属性，ID必须
     * @param user 用户信息
     * @return 成功更新的数量
     */
    public Integer updateNotNull(User user){
        return restTemplate.postForObject(DBUrl+USER+UPDATE_NOT_NULL,user,Integer.class);
    }

    /**
     * 根据examole有效属性值搜索用户，空信息无效
     * @param example 用户信息
     * @return 用户信息集
     */
    public List findByProperty(User example){
        ArrayList<User> users = null;
        String json= restTemplate.postForObject(DBUrl+USER+FIND_BY_PROP,example,String.class);
        ObjectMapper objectMapper=new ObjectMapper();
        try {
            users =
                    objectMapper.readValue(json, new TypeReference<ArrayList<User>>(){});
        } catch (IOException e) {
            e.printStackTrace();
        }
        return users;
    }

    /**
     * 将用户权限提升为超级超级管理员
     * @param user 用户信息，必须包含ID
     * @return 成功更新数
     */
    public Integer authorize(User user){
        user.setRole(UserRole.SUPER_ADMIN.getCode());
        return updateNotNull(user);
    }

    /**
     * 更改用户密码
     * @param user 用户信息,必须包含ID
     * @param newPasswd 新密码
     * @return 成功更新数
     */
    public Integer changPasswd(User user,String newPasswd){
        user.setPassword(SecurityUtil.encode(newPasswd));
        return updateNotNull(user);
    }

    /**
     * 获取用户权限类型及代号
     * @return [{代号:用户权限类型}]
     */
    public Map getRole(){
        Map roles=new HashMap();
        for (UserRole role:UserRole.values()) {
            roles.put(role.getCode(),role.getMessage());
        }
        return roles;
    }

    /**
     * 根据用户ID查找用户
     * @param id 用户ID
     * @return 用户信息
     */
    public User findByKey(String id){
        User user=new User();
        user.setId(Integer.valueOf(id) );
        List<User> users=findByProperty(user);
        if(users.size()>0)
            return users.get(0);
        else
            return null;
    }

    /**
     * 根据用户名搜索用户
     * @param username 用户信息
     * @return 用户信息集
     */
    public List<User> finndByName(String username){
        User user=new User();
        user.setUsername(username);
        List<User> users=findByProperty(user);
        if(users.size()>0)
            return users;
        else
            return null;
    }


}
